package com.meihuayishu.backend.ai.impl;

import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 梅花易数AI提示词模板配置
 * 基于邵雍梅花易数理论，设计符合预测准确性要求的专业提示词
 */
@Component
public class MeihuaPromptTemplates {

    /**
     * 专业卦象解读模板（针对预测准确性优化）
     */
    public static final String PROFESSIONAL_INTERPRETATION_TEMPLATE = """
            你是当代最杰出的梅花易数大师，师承邵雍传统，具有40年实战经验。请按照正统梅花易数理论，对以下卦象进行精准解读。
            
            ## 卦象信息
            **本卦构成：** {guaUp}（上卦）+ {guaDown}（下卦）
            **体用关系：** 体卦{bodyGua}，用卦{useGua}  
            **互卦变化：** {huGuaUp}{huGuaDown} → {changeGua}
            **动爻位置：** 第{changeYao}爻变动
            
            ## 五行生克
            - 体卦五行：{bodyWuxing} | 用卦五行：{useWuxing}
            - 生克关系：{bodyUseRelation}
            - 变卦影响：{changeWuxing}对体卦的作用
            
            ## 咨询背景
            **问题：** {question}
            **时空因素：** {timeContext}
            
            ## 解读要求
            1. **观物取象原则**：严格按照邵雍观物取象法，从具体卦象推演事理
            2. **体用生克为核心**：以体卦代表求测者，用卦代表所测之事，生克关系决定吉凶
            3. **动静变化分析**：静卦看现状，动爻察变化，变卦断未来
            4. **时空结合判断**：结合起卦时间、节气、方位等时空因素
            5. **准确率导向**：基于历史验证的高准确率卦例，提供精准判断
            
            ## 输出格式
            
            ### 一、卦象本意
            [从卦象名称、爻辞、彖辞角度阐释卦象本身的含义]
            
            ### 二、体用分析
            **当前状态（体卦{bodyGua}）：** [分析求测者当前的状态和能力]
            **所测之事（用卦{useGua}）：** [分析所测事物的性质和发展态势]  
            **生克关系（{bodyUseRelation}）：** [详细分析五行生克对事态发展的具体影响]
            
            ### 三、动爻解读
            **第{changeYao}爻动象：** [解读此爻发动的象征意义]
            **变化趋势：** [从本卦变为{changeGua}卦的发展轨迹]
            **变卦指导：** [变卦对未来局势的指示意义]
            
            ### 四、时机把握
            **有利时机：** [根据卦象指示，何时行动最为有利]
            **不利征兆：** [需要警惕的时间点和信号]
            **关键节点：** [事态发展的重要转折时机]
            
            ### 五、准确判断
            **成功概率：** [基于五行生克，给出客观的成功概率区间]
            **关键因素：** [影响成败的3个最重要因素]
            **验证指标：** [可观察的具体现象，用于验证卦象准确性]
            
            ### 六、实用指导
            [提供5条具体可行的行动建议，每条都要：]
            1. 明确可操作
            2. 符合卦象指导
            3. 结合现实条件  
            4. 有时间节点
            5. 可验证效果
            
            注意：本解读严格遵循邵雍梅花易数传统，结合现代预测需求，力求准确实用。请避免模糊表述，给出明确指导。
            """;

    /**
     * 专业行动建议模板
     */
    public static final String ACTION_GUIDANCE_TEMPLATE = """
            基于梅花易数卦象，为用户制定精准的行动策略。
            
            ## 卦象基础
            - 本卦：{originalName} → 变卦：{changedName}
            - 问题类型：{questionType}
            - 用户背景：{userContext}
            
            ## 策略制定原则
            1. **顺应卦理**：每个建议都要符合卦象指导思想
            2. **分步实施**：按照轻重缓急，分阶段执行
            3. **可量化验证**：提供具体的成功指标
            4. **风险控制**：预设应对不利变化的备选方案
            5. **时机敏感**：明确最佳执行时间窗口
            
            请生成7条分层次的行动建议：
            
            **紧急行动（3天内）：**
            1. [立即可执行的第一步行动]
            
            **短期策略（1-2周）：**  
            2. [关键性的准备工作]
            3. [重要关系的建立]
            
            **中期布局（1-3个月）：**
            4. [核心能力的提升]  
            5. [资源的积累配置]
            
            **长期发展（3个月以上）：**
            6. [战略性的重大决策]
            
            **应急预案：**
            7. [遇到不利情况的应对措施]
            
            每条建议格式：**[时间节点] 具体行动 - 预期效果 - 验证标准**
            """;

    /**
     * 不同问题类型的专用模板
     */
    public static final Map<String, String> SPECIALIZED_TEMPLATES = Map.of(
        "事业", """
            ## 事业运势专项解读
            
            基于卦象 {guaUp}{guaDown} → {changeGua}，分析事业发展：
            
            **职场定位（体卦{bodyGua}）：** [你在职场中的优势和定位]
            **事业机遇（用卦{useGua}）：** [当前面临的机会和挑战] 
            **发展趋势（变卦{changeGua}）：** [未来3-6个月的发展轨迹]
            
            **关键建议：**
            - 上级关系：[如何处理与领导的关系]
            - 同事协作：[团队合作的注意事项]  
            - 技能提升：[需要重点发展的能力]
            - 跳槽时机：[是否适合变动，最佳时机]
            - 创业可行性：[如果考虑创业的可行性分析]
            """,
            
        "感情", """
            ## 感情运势专项解读
            
            基于卦象 {guaUp}{guaDown} → {changeGua}，分析感情状况：
            
            **自身状态（体卦{bodyGua}）：** [你在感情中的状态和魅力]
            **对方情况（用卦{useGua}）：** [对方的心意和态度变化]
            **关系走向（变卦{changeGua}）：** [感情发展的未来趋势]
            
            **具体指导：**
            - 告白时机：[表达心意的最佳时机]
            - 相处模式：[如何增进感情的建议]
            - 矛盾化解：[处理争执的有效方法]  
            - 结婚时机：[如果考虑婚姻的时机分析]
            - 分手信号：[需要警惕的关系危机]
            """,
            
        "财运", """
            ## 财运专项解读
            
            基于卦象 {guaUp}{guaDown} → {changeGua}，分析财富运势：
            
            **财富根基（体卦{bodyGua}）：** [你的财富积累能力和方式]
            **财源方向（用卦{useGua}）：** [主要的收入来源和机会]
            **财运变化（变卦{changeGua}）：** [未来财运的发展趋势]
            
            **投资建议：**
            - 投资方向：[适合的投资类型和领域]
            - 风险控制：[需要避免的财务风险]
            - 收益时机：[最佳的获利时间点]
            - 支出控制：[开支方面的注意事项]  
            - 财富规划：[长期的财富积累策略]
            """,
            
        "健康", """
            ## 健康运势专项解读
            
            基于卦象 {guaUp}{guaDown} → {changeGua}，分析身体状况：
            
            **体质状态（体卦{bodyGua}）：** [当前的身体素质和健康水平]
            **健康影响因素（用卦{useGua}）：** [影响健康的主要因素]
            **健康趋势（变卦{changeGua}）：** [未来健康状况的变化]
            
            **养生建议：**
            - 饮食调理：[适合的饮食结构和禁忌]
            - 运动方式：[推荐的锻炼方法和强度]
            - 作息调整：[睡眠和日常作息的建议]
            - 疾病预防：[需要重点预防的健康问题]
            - 就医时机：[如有不适，最佳的就医时机]
            """
    );

    /**
     * 根据问题类型获取专用模板
     * @param questionType 问题类型
     * @return 对应的模板
     */
    public String getSpecializedTemplate(String questionType) {
        return SPECIALIZED_TEMPLATES.getOrDefault(questionType, PROFESSIONAL_INTERPRETATION_TEMPLATE);
    }

    /**
     * 构建完整的提示词
     * @param templateType 模板类型
     * @param variables 变量映射
     * @return 完整的提示词
     */
    public String buildPrompt(String templateType, Map<String, Object> variables) {
        String template = switch (templateType.toLowerCase()) {
            case "professional" -> PROFESSIONAL_INTERPRETATION_TEMPLATE;
            case "action" -> ACTION_GUIDANCE_TEMPLATE;
            case "事业", "career" -> SPECIALIZED_TEMPLATES.get("事业");
            case "感情", "love" -> SPECIALIZED_TEMPLATES.get("感情");
            case "财运", "wealth" -> SPECIALIZED_TEMPLATES.get("财运");
            case "健康", "health" -> SPECIALIZED_TEMPLATES.get("健康");
            default -> PROFESSIONAL_INTERPRETATION_TEMPLATE;
        };
        
        // 简单的变量替换
        String result = template;
        for (Map.Entry<String, Object> entry : variables.entrySet()) {
            String placeholder = "{" + entry.getKey() + "}";
            String value = entry.getValue() != null ? entry.getValue().toString() : "";
            result = result.replace(placeholder, value);
        }
        
        return result;
    }

    /**
     * 分析问题类型
     * @param question 用户问题
     * @return 问题类型
     */
    public String analyzeQuestionType(String question) {
        if (question == null || question.trim().isEmpty()) {
            return "综合";
        }
        
        String lowerQuestion = question.toLowerCase();
        
        if (lowerQuestion.contains("工作") || lowerQuestion.contains("事业") || 
            lowerQuestion.contains("职场") || lowerQuestion.contains("升职") ||
            lowerQuestion.contains("创业") || lowerQuestion.contains("跳槽")) {
            return "事业";
        }
        
        if (lowerQuestion.contains("感情") || lowerQuestion.contains("爱情") ||
            lowerQuestion.contains("恋爱") || lowerQuestion.contains("结婚") ||
            lowerQuestion.contains("分手") || lowerQuestion.contains("表白")) {
            return "感情";
        }
        
        if (lowerQuestion.contains("财运") || lowerQuestion.contains("投资") ||
            lowerQuestion.contains("理财") || lowerQuestion.contains("赚钱") ||
            lowerQuestion.contains("财富") || lowerQuestion.contains("收入")) {
            return "财运";
        }
        
        if (lowerQuestion.contains("健康") || lowerQuestion.contains("身体") ||
            lowerQuestion.contains("疾病") || lowerQuestion.contains("养生") ||
            lowerQuestion.contains("医院") || lowerQuestion.contains("治疗")) {
            return "健康";
        }
        
        return "综合";
    }

    /**
     * 获取时空背景信息
     * @param timestamp 时间戳
     * @return 时空背景描述
     */
    public String getTimeContext(Long timestamp) {
        if (timestamp == null) {
            return "当前时刻";
        }
        
        // 这里可以添加更复杂的时空分析，比如节气、月相等
        java.time.LocalDateTime dateTime = java.time.LocalDateTime.ofInstant(
            java.time.Instant.ofEpochMilli(timestamp),
            java.time.ZoneId.systemDefault()
        );
        
        return String.format("%d年%d月%d日%d时", 
            dateTime.getYear(), 
            dateTime.getMonthValue(), 
            dateTime.getDayOfMonth(), 
            dateTime.getHour());
    }
}